先直接看成果
以上為展示影片,既然說是webgl了,當然可以直接用瀏覽器連
但是如果有碰到瀏覽器不支援就先抱歉了,因為我還沒處理到這塊。
今天的工作就是處理星星的部分。
因為之前的星星都只在一個固定的方向,當地球開始旋轉了之後,星星就不見了。
有想過說,用dynamic buffer的形式,一旋轉就重新計算星星的位置,但是從螢幕上的點反投影的計算
一直都怪怪的! 於是乾脆想別的方法,就是在xz平面的八個方位(東 西 南 北 東南 西南 西北 東北)都貼上一片星星,
這樣看起來就是會被星星圍繞的!
所以首先一開始的 點坐標buufer,材質坐標buffer,繪圖所以buffer都全部改成陣列
var
starFieldVerticeBuffer = [],
starFieldIndexBuffer = [],
starFieldTextureCordBuffer = []
然後將setupStarField包裝成一個函式
function setupStarFieldBuffer(normal,xvec,yvec)
{
var number = 100;
var group = 5;
var center = [0,0,-1];
var radius = 0.2;
var depth = 50.0;
var starField = new StarField(normal,group,number,center,radius,depth,xvec,yvec);
starField.buildField();
var starfieldVerticeArray = starField.starFieldQuadArray;// starField.starFieldQuadArray;
var starfieldVerticeIndiceArray = starField.starFieldIndiceArrayForPlane;// starField.starFieldIndiceArray;
vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(starfieldVerticeArray), gl.STATIC_DRAW);
starFieldVerticeBuffer.push(vertexBuffer);
var indexBuffer = [];
for(var i=0;i<starfieldVerticeIndiceArray.length;i++){
indexBuffer[i] = gl.createBuffer();
indexBuffer[i].number_vertex_points = starfieldVerticeIndiceArray[i].length;
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer[i]);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(starfieldVerticeIndiceArray[i]), gl.STATIC_DRAW);
}
starFieldIndexBuffer.push(indexBuffer);
textureCordBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER,textureCordBuffer);
gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(starField.starFieldTextureCordArray),gl.STATIC_DRAW);
starFieldTextureCordBuffer.push(textureCordBuffer);
}
輸入的參數就是法向量,以及法向量所代表的那個平面的兩個正交的向量。
然後setupBuffer中加入
function setupDynamicBuffers(){
// star field
var normals=[];
normals.push([0,0,-1]);
normals.push([0,0,1]);
normals.push([1,0,0]);
normals.push([-1,0,0]);
normals.push([1,0,1]);
normals.push([1,0,-1]);
normals.push([-1,0,1]);
normals.push([-1,0,-1]);
// xvec,yvec
var xvecs=[];
xvecs.push([1,0,0]);
xvecs.push([1,0,0]);
xvecs.push([0,0,1]);
xvecs.push([0,0,1]);
xvecs.push([1,0,-1]);
xvecs.push([1,0,1]);
xvecs.push([1,0,1]);
xvecs.push([1,0,-1]);
var yvecs=[];
yvecs.push([0,1,0]);
yvecs.push([0,1,0]);
yvecs.push([0,1,0]);
yvecs.push([0,1,0]);
yvecs.push([0,1,0]);
yvecs.push([0,1,0]);
yvecs.push([0,1,0]);
yvecs.push([0,1,0]);
for(var i=0;i<8;i++){
setupStarFieldBuffer(normals[i],xvecs[i],yvecs[i]);
}
}
分別設定八個方位的星星坐標系
然後一樣把星星的繪圖函式包起來
function drawStarfield(vertexBuffer,indiceBufferArray,texturecordBuffer)
{
vertexPositionAttribute = gl.getAttribLocation(glProgram, "aVertexPosition");
gl.enableVertexAttribArray(vertexPositionAttribute);
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.vertexAttribPointer(vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);
vertexTexCoordAttribute = gl.getAttribLocation(glProgram, "aTextureCoord");
gl.enableVertexAttribArray(vertexTexCoordAttribute);
gl.bindBuffer(gl.ARRAY_BUFFER,texturecordBuffer);
gl.vertexAttribPointer(vertexTexCoordAttribute, 2, gl.FLOAT, false, 0, 0);
glProgram.textureSwitch = gl.getUniformLocation(glProgram,"textureSwitch");
for(var i=0;i<STAR_TEXTURE_5;i++){
gl.bindTexture(gl.TEXTURE_2D, texture[i]);
gl.uniform1i(glProgram.textureSwitch,i+1);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indiceBufferArray[i]);
gl.drawElements(gl.TRIANGLES, indiceBufferArray[i].number_vertex_points, gl.UNSIGNED_SHORT, 0);
}
}
輸入的函式就是繪圖所需要的那三個buffer(位置,材質,索引)
最後在drawScene函式中,把星星畫出來即可
var length = starFieldTextureCordBuffer.length;
for(var i=0;i<length;i++){
drawStarfield(starFieldVerticeBuffer[i],starFieldIndexBuffer[i],starFieldTextureCordBuffer[i] );
}
如此一來就大功告成囉~~
明天就可以加入FB登入,截取資訊的要素!